<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <span class="defineP"></span>
    <script>
        // var a = 22;
        // let obj = {
        //     a: 111,
        //     foo: function() {
        //         console.log(this.a)
        //     }
        // };
        // // Reflect.apply(target, thisArgument, argumentsList)
        // // 第二个参数传undefined则默认为window
        // obj.foo.apply(undefined, []);
        // Reflect.apply(obj.foo, obj, [])
        // console.log(Reflect.apply(obj.foo, obj, []))


        // function Person(name) {
        //     this.name = name
        // };
        // console.log(Person.prototype);
        // let person = new Person('小红');
        // console.log(person);
        // // 构造函数实例化
        // let rPerson = Reflect.construct(Person, ['小红']);
        // console.log(rPerson)




        // let obj = {
        //     a: 1
        // };
        // const oDefineP = document.getElementsByClassName('defineP')[0];
        // oDefineP.innerHTML = obj.a;
        // Object.keys(obj).forEach(key => {
        //     let value = obj[key];
        //     // 类似Object.defineProperty，如果设置成功会返回true
        //     let bool = Reflect.defineProperty(obj, 'a', {
        //         get() {
        //             return value;
        //         },
        //         set(newVal) {
        //             value = newVal;
        //             const oDefineP = document.getElementsByClassName('defineP')[0];
        //             oDefineP.innerHTML = value;
        //         }
        //     })
        //     console.log(bool) // true
        // })
        // setTimeout(function() {
        //     obj.a = 2;
        // }, 2000)



        // let obj = {
        //     a: 1,
        //     b: 2
        // };
        // delete obj.a;
        // console.log(obj);
        // // 类似delete
        // Reflect.deleteProperty(obj, 'b')
        // console.log(obj)



        // let obj = {
        //     a: 1,
        //     b: 2
        // };
        // // 类似于obj['a']
        // console.log(Reflect.get(obj, 'a'));


        // let obj = {
        //     a: 1,
        //     b: 2
        // };
        // // Reflect.getOwnPropertyDescriptor(terget, key) 返回该属性的描述，如果没有该属性，返回undefined
        // console.log(Reflect.getOwnPropertyDescriptor(obj, 'a'))
        // // { 
        // //     value: 1,
        // //     writable: true,
        // //     enumerable: true,
        // //     configurable: true
        // // }
        // console.log(Reflect.getOwnPropertyDescriptor(obj, 'c')) // undefined




        // let obj = {
        //     a: 1,
        //     b: 1
        // };
        // // Reflect.getPrototypeOf(obj)获取原型
        // console.log(Object.getPrototypeOf(obj));
        // console.log(Reflect.getPrototypeOf(obj));


        // let obj = {
        //     a: 1
        // };
        // obj.__proto__.b = 222;
        // console.log(Reflect.has(obj, 'a'))
        // console.log(Reflect.has(obj, 'b'))
        // console.log('a' in obj)
        // console.log('b' in obj)
        // console.log(obj.hasOwnProperty('a'))
        // console.log(obj.hasOwnProperty('b'));
        // // in  Reflect.has  都可以访问原型链上的属性
        // // obj.hasOwnProperty   只能访问自身属性




        // var obj = {
        //     a: 1
        // }
        // 判断对象是否可扩展
        // console.log(Reflect.isExtensible(obj))
        // console.log(Object.isExtensible(obj))
        // // 阻止扩展目标对象如果成功返回true
        // let bool = Reflect.preventExtensions(obj);
        // console.log(bool);
        // console.log(Reflect.isExtensible(obj))
        // console.log(Object.isExtensible(obj))
        // 区别：Object.isExtensible()中传入非对象，会发生强制类型转换为对象，
        // Reflect.isExtensible(),会抛出类型错误
        // console.log(Reflect.isExtensible(1))
        // console.log(Object.isExtensible(1))




        // var obj = {
        //     a: 1,
        //     b: 2
        // };
        // Object.defineProperty(obj, 'a', {
        //     enumerable: false
        // })
        // // 返回包含对象所有自身属性的数组，
        // // Reflect.ownKeys不受enumerable影响
        // console.log(Reflect.ownKeys(obj))
        // console.log(Object.keys(obj))



        // 把值分配给对象的属性。成功后返回true
        // Reflect.set(target, propertyKey, value[, receiver])
        // 如果遇到 setter，receiver则为setter调用时的this值。
        // var obj = {
        //     a: 1
        // };
        // let bool = Reflect.set(obj, 'a', 222);
        // console.log(bool);
        // console.log(obj)


        // 设置obj的原型__porto__
        // var obj = {
        //     a: 1
        // };
        // Reflect.setPrototypeOf(obj, { a: 222, b: 333 })
        // console.log(obj)
    </script>
</body>

</html>